package game;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
import java.util.Date;

import javax.swing.JFrame;

/**
 * 飞机游戏的主窗口
 * @author 唐利军
 * 继承一个类
 * 基础JFrame 使用双缓冲技术
 * 使用容器或数组产生多发炮弹
 * 每个物体都是矩形，判断该矩形有没有相交
 */

public class MyGameFrame extends JFrame {
	//双缓冲技术
	private Image offscree = null;
	public void upate(Graphics gs){
		if (offscree == null){//先画一个图片缓存
			offscree = this.createImage(Constant.GAME_WIDH,Constant.GAME_HEIGHT);//这是游戏窗口的高度和宽度
			Graphics goff = offscree.getGraphics();
			paint(goff);//自动被调用， Graphics相当于一只画笔
			gs.drawImage(offscree,0,0,null);
		}
	}
	//Toolkit tool = this.getToolkit();
	//Image ball = tool.getImage("images/ba.png");
	Image plane = GameUtil.getImage("images/plane.png");
	Image bg = GameUtil.getImage("images/bg.jpg");
	//动态的让飞机动
	int planex = 250,planey=250;

	Plane planes = new Plane(plane,250,250);
	//炮弹
	Shell shell = new Shell();
	//使用容器或数组产生多发炮弹
	//ArrayList<Shell> arrayList = new ArrayList<>();
	Shell[] shells = new Shell[50];
	//爆炸效果实现 轮播图
	Explode dao;
	//计时功能 核心：时间计算：当前时间-游戏结束时间 2。显示时间到窗口
	Date starTime = new Date();
	Date endTime;
	int period;//游戏持续时间
	/**
	 * 窗口绘制
	 * 图型和文本绘制 paint方法重写print(Graphics g)方法
	 * Graphics 画笔对象——画图形
	 */
	@Override
	public void paint(Graphics g) {//自动被调用， Graphics相当于一只画笔
		/*
		super.paint(g);
		Color c = g.getColor();
		Font f = g.getFont();//改字体
		g.setColor(Color.BLUE);//改变颜色
		g.drawLine(810, 100, 300, 300);//线
		g.drawRect(100, 100, 300, 300);//矩形
		g.drawOval(100, 100, 300, 300);//椭圆
		g.fillRect(100, 100, 40, 40);//实心
		g.setColor(Color.RED);//改变颜色为红色
		g.setFont(new Font("宋体",f.BOLD,50));
		g.drawString("我是谁?", 200, 200);
		g.setColor(c);//改回去*/
		Color c = g.getColor();
		g.drawImage(bg,0,0,null);
		planes.drawSelf(g);//画飞机
		//g.drawImage(plane,planex,planey,null);
		//画出所有的炮弹
		for (int j = 0; j < shells.length; j++) {
			shells[j].draw(g);
			//每个物体都是矩形，判断该矩形有没有相交
			//javaAPI提供了Rectangle类来表示矩形相关信息，并且提供了intersects()方法，
			//飞机和炮弹的碰撞监测！！！
			boolean peng = shells[j].getRect().intersects(planes.getRect());
			if (peng){
				planes.live = false;
					if (dao == null){
						dao = new Explode(planes.x,planes.y);//获取飞机planex,planey
						//计时功能，给出提示
						endTime = new Date();
						period = (int)((endTime.getTime() - starTime.getTime())/1000);
					}

					dao.draw(g);
			}
			if (!planes.live){
				g.setColor(Color.red);
				Font font = new Font("宋体",Font.BOLD,20);
				g.setFont(font);
				g.drawString("游戏时间"+period+"秒",(int) planes.x,(int)planes.y);
			}
			g.setColor(c);
		}
		//炮弹
		//shell.draw(g);
	}
 int i;
	/**
	 * 使用内部类 可以谁便调用该类的属性和方法
	 * 帮助我们反复的重画窗口！
 	 */
	class PaintThread extends Thread{
		@Override
		public void run() {
			while (true){
				i++;
				//System.out.printf("窗口画 %d 次\n",i);
				repaint();//重画
				try {
					Thread.sleep(40);//1s = 1000ms
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}
	//键盘控制 定义键盘监听的内部类
	class KeyMonitor extends KeyAdapter {
		//重写父类两个方法 keyPressed按下 keyReleased 抬起
		public void keyPressed(KeyEvent e) {
			planes.addDirection(e);
		}
		public void keyReleased(KeyEvent e) {
			planes.minusDirection(e);
		}
	}

	/**
	 * 初始化窗口
	 */
	public void launchFeame() {
		//this.setTitle("飞机 2022-9-10-1");
		this.setTitle("飞机 2022-9-10-2");
		this.setVisible(true);//显示可见
		//设置大小
		this.setSize(Constant.GAME_WIDH,Constant.GAME_HEIGHT);
		//位置
		this.setLocation(300, 300);
		this.addWindowListener(new WindowAdapter() {
			/**
			 * 关闭
			 */
			@Override
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
		new PaintThread().start();//启动重画窗口的线程
		addKeyListener(new KeyMonitor());//给窗口增加键盘的监听
		//生成初始化50个炮弹
		for (int i = 0; i < shells.length; i++) {
			shells[i] = new Shell();

		}
	}
	
	public static void main(String[] args) {
		MyGameFrame f = new MyGameFrame();
		f.launchFeame();
	} 

}
